home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TeX 1995 July
/
TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO
/
dviware
/
dvi2ps
/
dvi-to-ps
/
tex.ps
< prev
Wrap
Text File
|
1990-10-01
|
13KB
|
386 lines
%! for use by dvi2ps Version 2.00
% $Header: tex.ps,v 2.0 88/06/07 15:12:32 peterd Rel2 $
% a start (Ha!) at a TeX mode for PostScript.
% The following defines procedures assumed and used by program "dvi2ps"
% and must be downloaded or sent as a header file for all TeX jobs.
% By: Neal Holtz, Carleton University, Ottawa, Canada
% <holtz@cascade.carleton.cdn>
% <holtz%cascade.carleton.cdn@ubc.csnet>
% June, 1985
% Last Modified: Aug 25/85
% oystr 12-Feb-1986
% Changed @dc macro to check for a badly formed bits in character
% definitions. Can get a <> bit map if a character is not actually
% in the font file. This is absolutely guaranteed to drive the
% printer nuts - it will appear that you can no longer define a
% new font, although the built-ins will still be there.
% mackay 4-Jan-1988
% Changed size of character array to reflect gf usage (256 characters)
% To convert this file into a downloaded file instead of a header
% file, uncomment all of the lines beginning with %-%
%-%0000000 % Server loop exit password
%-%serverdict begin exitserver
%-% systemdict /statusdict known
%-% {statusdict begin 9 0 3 setsccinteractive /waittimeout 300 def end}
%-% if
/TeXDict 200 dict def % define a working dictionary
TeXDict begin % start using it.
% units are in "dots" (300/inch)
/Resolution 300 def
/Inch {Resolution mul} def % converts inches to internal units
/Mtrx 6 array def
%%%%%%%%%%%%%%%%%%%%% Page setup (user) options %%%%%%%%%%%%%%%%%%%%%%%%
% dvi2ps will output coordinates in the TeX system ([0,0] 1" down and in
% from top left, with y +ive downward). The default PostScript system
% is [0,0] at bottom left, y +ive up. The Many Matrix Machinations in
% the following code are an attempt to reconcile that. The intent is to
% specify the scaling as 1 and have only translations in the matrix to
% properly position the text. Caution: the default device matrices are
% *not* the same in all PostScript devices; that should not matter in most
% of the code below (except for lanscape mode -- in that, rotations of
% -90 degrees resulted in the the rotation matrix [ e 1 ]
% [ 1 e ]
% where the "e"s were almost exactly but not quite unlike zeros.
/@letter
{ letter initmatrix
72 Resolution div dup neg scale % set scaling to 1.
310 -3005 translate % move origin to top (these are not exactly 1"
Mtrx currentmatrix pop % and -10" because margins aren't set exactly right)
} def
% note mode is like letter, except it uses less VM
/@note
{ note initmatrix
72 Resolution div dup neg scale % set scaling to 1.
310 -3005 translate % move origin to top
Mtrx currentmatrix pop
} def
/@landscape
{ letter initmatrix
72 Resolution div dup neg scale % set scaling to 1.
% -90 rotate % it would be nice to be able to do this
Mtrx currentmatrix 0 0.0 put % but instead we have to do things like this because what
Mtrx 1 -1.0 put % should be zero terms aren't (and text comes out wobbly)
Mtrx 2 1.0 put % Fie! This likely will not work on QMS printers
Mtrx 3 0.0 put % (nor on others where the device matrix is not like
Mtrx setmatrix % like it is on the LaserWriter).
300 310 translate % move origin to top
Mtrx currentmatrix pop
} def
/@legal
{ legal initmatrix
72 Resolution div dup neg scale % set scaling to 1.
295 -3880 translate % move origin to top
Mtrx currentmatrix pop
} def
/@manualfeed
{ statusdict /manualfeed true put
statusdict /manualfeedtimeout 300 put % 5 minutes
} def
% n @copies - set number of copies
/@copies
{ /#copies exch def
} def
%%%%%%%%%%%%%%%%%%%% Procedure Defintions %%%%%%%%%%%%%%%%%%%%%%%%%%
/@newfont % id @newfont - -- initialize a new font dictionary
{ /newname exch def
pop
newname 7 dict def % allocate new font dictionary
newname load begin
/FontType 3 def
/FontMatrix [1 0 0 -1 0 0] def
/FontBBox [0 0 1 1] def
% mackay 4-Jan-1987 changed size of array from 128 to 256 for gf fonts
/BitMaps 256 array def
/BuildChar {CharBuilder} def
/Encoding 256 array def
0 1 255 {Encoding exch /.undef put} for
end
newname newname load definefont pop
} def
% the following is the only character builder we need. it looks up the
% char data in the BitMaps array, and paints the character if possible.
% char data -- a bitmap descriptor -- is an array of length 6, of
% which the various slots are:
/ch-image {ch-data 0 get} def % the hex string image
/ch-width {ch-data 1 get} def % the number of pixels across
/ch-height {ch-data 2 get} def % the number of pixels tall
/ch-xoff {ch-data 3 get} def % number of pixels below origin
/ch-yoff {ch-data 4 get} def % number of pixels to left of origin
/ch-tfmw {ch-data 5 get} def % spacing to next character
/CharBuilder % fontdict ch Charbuilder - -- image one character
{ /ch-code exch def % save the char code
/font-dict exch def % and the font dict.
/ch-data font-dict /BitMaps get ch-code get def % get the bitmap descriptor for char
ch-data null eq not
{ ch-tfmw 0 ch-xoff neg ch-yoff neg ch-width ch-xoff sub ch-height ch-yoff sub
setcachedevice
ch-width ch-height true [1 0 0 1 ch-xoff ch-yoff]
{ch-image} imagemask
}
if
} def
/@sf % fontdict @sf - -- make that the current font
{ setfont() pop
} def
% in the following, the font-cacheing mechanism requires that
% a name unique in the particular font be generated
/@dc % char-data ch @dc - -- define a new character bitmap in current font
{ /ch-code exch def
% ++oystr 12-Feb-86++
dup 0 get
length 2 lt
{ pop [ <00> 1 1 0 0 8.00 ] } % replace <> with null
if
% --oystr 12-Feb-86--
/ch-data exch def
currentfont /BitMaps get ch-code ch-data put
currentfont /Encoding get ch-code
dup ( ) cvs cvn % generate a unique name simply from the character code
put
} def
/@bop0 % n @bop0 - -- begin the char def section of a new page
{
} def
/@bop1 % n @bop1 - -- begin a brand new page
{ pop
erasepage initgraphics
Mtrx setmatrix
/SaveImage save def() pop
} def
%-- tjh sept. 87: if this page has a mac drawing on it, we have to
%-- use showpage in the md dictionary.
/@eop % - @eop - -- end a page
{
userdict /md known {
userdict /md get type /dicttype eq {
md /MacDrwgs known {
md begin showpage end
}{
showpage
} ifelse
}{
showpage
} ifelse
}{
showpage
} ifelse
SaveImage restore() pop
} def
/@start % - @start - -- start everything
{ @letter % (there is not much to do)
} def
/@end % - @end - -- done the whole shebang
{ end
} def
/p % x y p - -- move to position
{ moveto
} def
/r % x r - -- move right
{ 0 rmoveto
} def
/s % string s - -- show the string
{ show
} def
/c % ch c - -- show the character (code given)
{ c-string exch 0 exch put
c-string show
} def
/c-string ( ) def
/ru % dx dy ru - -- set a rule (rectangle)
{ /dy exch neg def % because dy is height up from bottom
/dx exch def
/x currentpoint /y exch def def % remember current point
newpath x y moveto
dx 0 rlineto
0 dy rlineto
dx neg 0 rlineto
closepath fill
x y moveto
} def
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% the \special command junk
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% The structure of the PostScript produced by dvi2ps for \special is:
% @beginspecial
% - any number of @hsize, @hoffset, @hscale, etc., commands
% @setspecial
% - the users file of PostScript commands
% @endspecial
% The @beginspecial command recognizes whether the Macintosh Laserprep
% has been loaded or not, and redfines some Mac commands if so.
% The @setspecial handles the users shifting, scaling, clipping commands
%-- tjh sept. 87: made changes to allow postscript and macdrawing to
%-- to be inserted with version 65 of the md dictionary. Many bugs
%-- were fixed:
%-- vo changed to vof, name conflict with md
%-- vs changed to vsz, name conflict with md
%-- substantially changed @setspecial and @MacSetUp
%-- Also, made changes to allow users to specify offsets
%-- and clip rectangles in inches.
% The following are user settable options from the \special command.
/@SpecialDefaults
{ /hs 8.5 72 mul def
/vsz 11 72 mul def
/ho 0 def
/vof 0 def
/hsc 1 def
/vsc 1 def
/CLIP false def
} def
% d @hsize - specify a horizontal clipping dimension
% these 2 are executed before the MacDraw initializations
/@hsize {72 mul /hs exch def /CLIP true def} def
/@vsize {72 mul /vsz exch def /CLIP true def} def
% d @hoffset - specify a shift for the drwgs
/@hoffset {72 mul /ho exch def} def
/@voffset {72 mul /vof exch def} def
% s @hscale - set scale factor
/@hscale {/hsc exch def} def
/@vscale {/vsc exch def} def
/@setclipper
{ hsc vsc scale
CLIP
{ newpath 0 0 moveto hs 0 rlineto 0 vsz rlineto hs neg 0 rlineto closepath clip }
if
} def
% this will be invoked as the result of a \special command (for the
% inclusion of PostScript graphics). The basic idea is to change all
% scaling and graphics back to defaults, but to shift the origin
% to the current position on the page. Due to TeXnical difficulties,
% we only set the y-origin. The x-origin is set at the left edge of
% the page.
/@beginspecial
{ gsave /SpecialSave save def
% the following magic incantation establishes the current point as
% the users origin, and reverts back to default scalings, rotations
currentpoint transform initgraphics itransform translate
@SpecialDefaults % setup default offsets, scales, sizes
@MacSetUp % fix up Mac stuff
} def
%-- tjh: assume this is raw postscript, but save some state in case its not.
/@setspecial
{
/specmtrx matrix currentmatrix def
ho vof translate @setclipper
} def
/@endspecial
{ SpecialSave restore
grestore
} def
% - @MacSetUp - turn-off/fix-up all the MacDraw stuff that might hurt us
% we depend on 'psu' being the first procedure executed
% by a Mac document. We redefine 'psu' to adjust page
% translations, and to do all other the fixups required.
% This stuff will not harm other included PS files
/@MacSetUp
{ userdict /md known % if md is defined
{ userdict /md get type /dicttype eq % and if it is a dictionary
{
md begin % then redefine some stuff
/psu % redfine psu to set origins, etc.
/psu load
% this procedure contains almost all the fixup code
{
% /letter {} def % it is bad manners to execute the real
% /note {} def % versions of these (clears page image, etc.)
% /legal {} def
/MacDrwgs true def
specmtrx setmatrix % restore pre-@setspecial state.
initclip % ditto
% change smalls to prevent page clearing.
/smalls [ lnop lnop lnop lnop lnop lnop lnop lnop lnop ] def
0 0 0 0 ppr astore pop % prevents origin translation.
% redifine cp, do the showpage later, see @eop
/cp {
pop
pop
pm restore
} def % no printing of pages
}
concatprocs
def
/od
% redefine od to translate and scale.
% redfine load to set clipping region.
/od load
{
ho vof translate
hsc vsc scale
CLIP {
/nc
/nc load
{ newpath 0 0 moveto hs 0 rlineto 0 vsz rlineto
hs neg 0 rlineto closepath clip }
concatprocs
def
} if
}
concatprocs
def
end }
if }
if
} def
% p1 p2 concatprocs p - concatenate procedures
/concatprocs
{ /p2 exch cvlit def
/p1 exch cvlit def
/p p1 length p2 length add array def
p 0 p1 putinterval
p p1 length p2 putinterval
p cvx
} def
end % revert to previous dictionary